import axios from "axios"; //引入axios
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import { ElMessage } from "element-plus"; //element-plus消息提示

NProgress.configure({
  showSpinner: true, // 是否显示右上角螺旋加载提示
});
//"application/json; charset=utf-8;application/x-www-form-urlencoded;multipart/form-data"
//创建axios实例
const instance = axios.create({
  baseURL: "/api", //设置请求根路径，结合 vite.config.js 中 serve 选项使用
  timeout: 1000 * 10, //设置超时时间 10s
  withCredentials: true, //表示跨域请求时是否需要使用凭证
  headers: {
    "Content-Type": "application/x-www-form-urlencoded", //使用的这个进行数据传递。
  },
});

/* 请求拦截器 */
instance.interceptors.request.use(
  (config) => {
    //进度条开始
    NProgress.start();
    // console.log("请求拦截器", config);

    //jwt认证方式，携带请求头
    if (sessionStorage.getItem("Authorization")) {
      config.headers["Authorization"] = sessionStorage.getItem("Authorization");
    }

    return config;
  },
  (error) => {
    //进度条关闭
    NProgress.done();
    ElMessage.error("网络请求超时，请稍后重试...");
    return Promise.reject(error);
  }
);

/* 响应拦截器 */
instance.interceptors.response.use(
  (response) => {
    //进度条关闭
    NProgress.done();
    // console.log("响应拦截器", response);

    if (response.status === 200 && response.data.code === 20000) {
      // 成功
      return response.data;
    } else if (
      response.status === 200 &&
      (response.data.code === 20002 || response.data.code === 20003)
    ) {
      ElMessage.error(response?.data?.message);
      return response;
    } else {
      // 失败（code为各业务自定义code）
      ElMessage.error(response?.data?.message);
      return response;
    }
  },
  (err) => {
    //进度条关闭
    NProgress.done();

    //根据相对应的报错，展示相对应的提示
    if (err && err.response) {
      switch (err.response.status) {
        case 400:
          ElMessage.error("请求错误");
          break;
        case 401:
          ElMessage.error("授权过期，请重新登录");
          break;
        case 403:
          ElMessage.error("拒绝访问");
          break;
        case 404:
          ElMessage.error(`请求地址出错: ${err.response.config.url}`);
          break;
        case 408:
          ElMessage.error("请求超时");
          break;
        case 500:
          ElMessage.error("服务器内部错误");
          break;
        case 501:
          ElMessage.error("服务未实现");
          break;
        case 502:
          ElMessage.error("网关错误");
          break;
        case 503:
          ElMessage.error("服务不可用");
          break;
        case 504:
          ElMessage.error("网关超时");
          break;
        case 505:
          ElMessage.error("HTTP版本不受支持");
          break;
        default:
          ElMessage.error("未知错误，请联系管理员");
      }
    } else {
      ElMessage.error("网络请求超时，请稍后重试...");
    }
    return Promise.reject(err);
  }
);

class http {
  static async get(url, params) {
    return await instance.get(url, { params });
  }
  static async post(url, query) {
    return await instance.post(url, query);
  }
}

export default http;
